package pr.vodafone.service;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Vector;

import pr.vodafone.dao.GestorBD;
import pr.vodafone.dao.dto.Cliente;
import pr.vodafone.dao.dto.Factura;
import pr.vodafone.dao.dto.Linea;
import pr.vodafone.dao.dto.Terminal;

public class ServiceProvider {

	//=============================//
	//metodos para terminales
	//=============================//
	public Terminal obtenerTerminal(String idTerminal){
		GestorBD gestorBD = new GestorBD();
		Terminal terminal= null;
		try {
			gestorBD.conectar();
			terminal= gestorBD.obtenerTerminal(idTerminal);
			gestorBD.desconectar();
		} catch (ClassNotFoundException e) {
			
			e.printStackTrace();
		} catch (SQLException e) {
			
			e.printStackTrace();
		}
		return terminal;
	}
	public Terminal[] obtenerTerminales(){
		GestorBD gestorBD = new GestorBD();
		Terminal terminal[]= null;
		try {
			gestorBD.conectar();
			terminal= (Terminal[]) gestorBD.obtenerTerminales().toArray();
			gestorBD.desconectar();
		} catch (ClassNotFoundException e) {
			
			e.printStackTrace();
		} catch (SQLException e) {
			
			e.printStackTrace();
		}
		return terminal;
	}
	public Terminal[] obtenerTerminalesPorMarca(String marca){
		GestorBD gestorBD = new GestorBD();
		Terminal terminal[]= null;
		try {
			gestorBD.conectar();
			terminal= (Terminal[]) gestorBD.obtenerTerminalesPorMarca(marca).toArray();
			gestorBD.desconectar();
		} catch (ClassNotFoundException e) {
			
			e.printStackTrace();
		} catch (SQLException e) {
			
			e.printStackTrace();
		}
		return terminal;
	}
	public boolean insertarTerminal(Terminal terminal){
		GestorBD gestorBD = new GestorBD();
		boolean terminalInsertado= false;
		try {
			gestorBD.conectar();
			
			try{
				gestorBD.insertarTerminal(terminal);
			} catch (SQLException e){
				gestorBD.actualizarTerminal(terminal.getIdTerminal(),terminal);	
			}
			terminalInsertado=true;
			gestorBD.desconectar();
		} catch (ClassNotFoundException e) {
			
			e.printStackTrace();
		} catch (SQLException e) {
			
			e.printStackTrace();
		}
		System.out.println(terminalInsertado);
		return terminalInsertado;
	}
	public boolean actualizarTerminal(String idTerminal, Terminal terminal){
		GestorBD gestorBD = new GestorBD();
		boolean terminalActualizado= false;
		try {
			gestorBD.conectar();
			gestorBD.actualizarTerminal(idTerminal, terminal);
			terminalActualizado=true;
			gestorBD.desconectar();
		} catch (ClassNotFoundException e) {
			
			e.printStackTrace();
		} catch (SQLException e) {
			
			e.printStackTrace();
		}
		return terminalActualizado;
	}
	public boolean borrarTerminal(String idTerminal){
		GestorBD gestorBD = new GestorBD();
		boolean terminalBorrado= false;
		try {
			gestorBD.conectar();
			gestorBD.borrarTerminal(idTerminal);
			terminalBorrado=true;
			gestorBD.desconectar();
		} catch (ClassNotFoundException e) {
			
			e.printStackTrace();
		} catch (SQLException e) {
			
			e.printStackTrace();
		}
		return terminalBorrado;
	}
	
	//=============================//
	//metodos clientes
	//=============================//
    public Cliente obtenerCliente(String dni){
    	GestorBD gestorBD = new GestorBD();
    	Cliente cliente=null;
    	try {
			gestorBD.conectar();
			cliente=gestorBD.obtenerCliente(dni);
			gestorBD.desconectar();
		} catch (ClassNotFoundException | SQLException e) {
			e.printStackTrace();
		}
    	return cliente;
    }
    public ArrayList<Cliente> obtenerClientes(){
    	GestorBD gestorBD = new GestorBD();
    	ArrayList<Cliente> clientes=null;
    	Vector<Cliente> clientesVector=null;
    	try {
			gestorBD.conectar();
			clientesVector=gestorBD.obtenerClientes();
			clientes=new ArrayList<Cliente>(clientesVector);
			gestorBD.desconectar();
		} catch (ClassNotFoundException | SQLException e) {
			
			e.printStackTrace();
		}
    	return clientes;
    }
    public boolean insertarCliente(Cliente cliente){
    	GestorBD gestorBD = new GestorBD();
    	boolean isInserted=false;
    	try {
			gestorBD.conectar();
			if(gestorBD.insertarCliente(cliente)>0){
				isInserted=true;
			}
			gestorBD.desconectar();
			
		} catch (ClassNotFoundException e) {
			
			e.printStackTrace();
		} catch (SQLException e) {
			
			e.printStackTrace();
		}
    	return isInserted;
    }
    public boolean actualizarCliente(String dni, Cliente cliente){
    	GestorBD gestorBD = new GestorBD();
    	boolean isActualized=false;
    	try {
			gestorBD.conectar();
			if(gestorBD.actualizarCliente(dni, cliente)>0){
				isActualized=true;
			}
			gestorBD.desconectar();
		} catch (ClassNotFoundException e) {
			
			e.printStackTrace();
		} catch (SQLException e) {
			
			e.printStackTrace();
		}
    	
    	return isActualized;
    }
    public boolean borraCliente(String dni){
    	GestorBD gestorBD = new GestorBD();
    	boolean isDeleted=false;
    	try {
			gestorBD.conectar();
			if(gestorBD.borrarCliente(dni)>0){
				isDeleted=true;
			}
			gestorBD.desconectar();
		} catch (ClassNotFoundException e) {
			
			e.printStackTrace();
		} catch (SQLException e) {
			
			e.printStackTrace();
		}
    	
    	return isDeleted;
    }
   
    //=============================//    
    //metodos para lineas
    //=============================//
    public Linea obtenerLinea(String dni, String numeroTelefono){
    	GestorBD gestorBD = new GestorBD();
    	Linea linea=new Linea();
    	try {
			gestorBD.conectar();
			linea=gestorBD.obtenerLinea(numeroTelefono);
			if(linea != null&&!linea.getDni().equals(dni)){
				linea=null;
			}
		} catch (ClassNotFoundException e) {
			
			e.printStackTrace();
		} catch (SQLException e) {
			
			e.printStackTrace();
		}
    	return linea;
    }
    public ArrayList<Linea> obtenerLineas(String dni){
    	GestorBD gestorBD = new GestorBD();
    	ArrayList<Linea> lineas= null;
    	Vector<Linea>lineasVector=null;
    	try {
			gestorBD.conectar();
			lineasVector=gestorBD.obtenerLineasCliente(dni);
			lineas=new ArrayList<Linea>(lineasVector);
			gestorBD.desconectar();
		} catch (ClassNotFoundException e) {
			
			e.printStackTrace();
		} catch (SQLException e) {
			
			e.printStackTrace();
		}
    	
    	return lineas;
    }
    public boolean insertarLinea(String dni, Linea linea){
    	boolean insertado=false;
    	//validar el dni
    	if(dni.equals(linea.getDni())){
	    	GestorBD gestorBD = new GestorBD();	    	
	    	try {
				gestorBD.conectar();
				if(gestorBD.insertarLinea(linea)>0){
					insertado=true;
				}
				gestorBD.desconectar();
			} catch (ClassNotFoundException e) {
				
				e.printStackTrace();
			} catch (SQLException e) {
				
				e.printStackTrace();
			}
    	}
    	return insertado;
    }
    public boolean actualizarLinea(String dni, String numeroTelefono, Linea linea){
    	boolean actualizado=false;
    	GestorBD gestorBD = new GestorBD();	
    	try {
			gestorBD.conectar();
			if(gestorBD.actualizarLinea(numeroTelefono, linea)>0){
				actualizado=true;
			}
		} catch (ClassNotFoundException e) {
			
			e.printStackTrace();
		} catch (SQLException e) {
			
			e.printStackTrace();
		}
    	return actualizado;
    }
    public boolean borrarLinea(String dni, String numeroTelefono){
    	boolean borrado=false;
    	GestorBD gestorBD = new GestorBD();
    	
    	try {
			gestorBD.conectar();
			Linea linea=gestorBD.obtenerLinea(numeroTelefono);
			//validar dni
			if(linea.getDni().equals(dni)){
				if(gestorBD.borrarLinea(numeroTelefono)>0){
					borrado=true;
				}
			}
			gestorBD.desconectar();
		} catch (ClassNotFoundException e) {
			
			e.printStackTrace();
		} catch (SQLException e) {
			
			e.printStackTrace();
		}
    	
    	return borrado;
    }
    
    //=============================//
    //metodos para facturas
    //=============================//
    //(no se hacen las validaciones por dni, solo por numero de telefono)
    
    public Factura obtenerFactura(String dni, String numeroTelefono, int idFactura){
    	//igual era bueno validar el dni ademas del telefono, pero no se hace...
    	Factura factura=null;
    	GestorBD gestorBD = new GestorBD();
    	try {
			gestorBD.conectar();
			factura=gestorBD.obtenerFactura(idFactura);
			//validar telefono
			if(factura!=null &&(!factura.getTelefono().equals(numeroTelefono))){
				factura=null;
			}
			gestorBD.desconectar();
		} catch (ClassNotFoundException e) {
			
			e.printStackTrace();
		} catch (SQLException e) {
			
			e.printStackTrace();
		}
    	return factura;
    }
    public ArrayList<Factura> obtenerFacturas(String dni, String numeroTelefono){
    	ArrayList<Factura> facturas=null;
    	Vector<Factura> facturasVector=null;
    	GestorBD gestorBD = new GestorBD();
    	try {
			gestorBD.conectar();
			facturasVector=gestorBD.obtenerFacturasLinea(numeroTelefono);
			facturas=new ArrayList<Factura>(facturasVector);
			gestorBD.desconectar();
		} catch (ClassNotFoundException e) {
			
			e.printStackTrace();
		} catch (SQLException e) {
			
			e.printStackTrace();
		}
    	
    	return facturas;
    }
    public boolean insertFactura(String dni, String numeroTelefono, Factura factura){
    	boolean insertado=false;
    	if(factura.getTelefono().equals(numeroTelefono)){
    		GestorBD gestorBD = new GestorBD();
        	try {
    			gestorBD.conectar();
    			if(gestorBD.insertarFactura(factura)>0){
    				insertado=true;
    			}
    			gestorBD.desconectar();
    		} catch (ClassNotFoundException e) {
    			
    			e.printStackTrace();
    		} catch (SQLException e) {
    			
    			e.printStackTrace();
    		}
    	}
    	
    	return insertado;
    }
    public boolean actualizarFactura(String dni, String numeroTelefono, int idFactura, Factura factura){
    	boolean actualizado=false;
    	GestorBD gestorBD = new GestorBD();
    	try {
			gestorBD.conectar();
			if(gestorBD.obtenerFactura(idFactura).getTelefono().equals(numeroTelefono)){
				if(gestorBD.actualizarFactura(idFactura, factura)>0){
					actualizado=true;
				}
			}
			gestorBD.desconectar();
		} catch (ClassNotFoundException e) {
			
			e.printStackTrace();
		} catch (SQLException e) {
			
			e.printStackTrace();
		}
    	return actualizado;
    }
    public boolean borrarFactura(String dni, String numeroTelefono, int idFactura){
    	boolean elimnado=false;
    	GestorBD gestorBD = new GestorBD();
    	try {
			gestorBD.conectar();
			if(gestorBD.obtenerFactura(idFactura).getTelefono().equals(numeroTelefono)){
				if(gestorBD.borrarFactura(idFactura)>0){
					elimnado=true;
				}
			}
			gestorBD.desconectar();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
    	return elimnado;
    }
    
}

